/*=========================================================================
 *
 *                 这个demo演示通过匿名管道实现进程通信
 *                 通过这个demo体会pipe接口的使用
 *
 *========================================================================*/

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>


int main()
{
  //匿名管道只能用于具有亲缘关系的进程间通信，子进程复制父进程的方式获得操作句柄
  //因此要注意：创建管道一定要放在创建子进程之前。这样子进程才可以复制到管道信息
  
  int pipefd[2] = {-1};      //pipefd[0]用于从管道读取数据   pipefd[1]用于向管道写入数据

  int ret =pipe(pipefd);     //成功返回0，失败返回-1
  if(ret < 0)
  {
    perror("pipe error");
    return -1;
  }
  pid_t pid =fork();
  if(pid == 0){
    //子进程从管道读取数据
    close(pipefd[1]);     //关闭读端
    sleep(3);
    char buf[1024] = {0};
    int rlen = read(pipefd[0],buf,1023);          //从管道读取数据使用pipefd[0]
    printf("child:%d - %s ",rlen,buf);
  }else if(pid>0){
    //父进程向管道写入数据
    close(pipefd[1]);     //不要忘记关闭父进程的读端，否则total还是会被打印出来
    sleep(1000);     //为了让子进程先运行
    char ptr[] = "zhe两天好冷!~~\n";
    write(pipefd[1],ptr,strlen(ptr));  //向管道写入写入数据使用pipefd[1]
    while(1)
    {
      int wlen = write(pipefd[1],ptr,strlen(ptr));
      int total_len =total_len + wlen;
      printf("total_len = %d\n",total_len);
    }
  }
  return 0;
}
